package com.cyy.demo.utils;

import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import  org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.concurrent.TimeUnit;

@Component
public class RedisUtils {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 默认过期时长，单位：秒
     */
    public static final long DEFAULT_EXPIRE = 60 * 60 * 24;

    /**
     * 不设置过期时长
     */
    public static final long NOT_EXPIRE = -1;

    /**
     * key是否存在
     */
    public boolean existsKey(String key) {
        return redisTemplate.hasKey(key);
    }

    /**
     * 删除key
     */
    public void deleteKey(String key) {
        redisTemplate.delete(key);
    }

    /**
     * 设置key的生命周期
     * @param key
     * @param time
     * @param timeUnit
     */
    public void expireKey(String key, long time, TimeUnit timeUnit) {
        redisTemplate.expire(key, time, timeUnit);
    }

    /**
     * 指定key在指定的日期过期
     *
     * @param key
     * @param date
     */
    public void expireKeyAt(String key, Date date) {
        redisTemplate.expireAt(key, date);
    }

    /**
     * 查询key的生命周期
     *
     * @param key
     * @param timeUnit
     * @return
     */
    public long getKeyExpire(String key, TimeUnit timeUnit) {
        return redisTemplate.getExpire(key, timeUnit);
    }

    /**
     * 将key设置为永久有效
     *
     * @param key
     */
    public void persistKey(String key) {
        redisTemplate.persist(key);
    }

    /**
     * 向redis存字符串
     *
     * @param key
     */
    public void set(String key,String value) {
        stringRedisTemplate.opsForValue().set(key,value);
    }

    /**
     * 向redis存字符串，指定存储时间
     *
     * @param key
     */
    public void set(String key,String value,long second) {
        stringRedisTemplate.opsForValue().set(key,value,second);
    }

    /**
     * 向redis存字符串，指定存储时间
     *
     * @param key
     */
    public void set(String key,String value,long second,TimeUnit timeUnit) {
        stringRedisTemplate.opsForValue().set(key,value,second,timeUnit);
    }

    /**
     * 向redis存对象
     *
     * @param key
     */
    public void set(String key,Object value) {
        redisTemplate.opsForValue().set(key,JSON.toJSONString(value));
    }
    /**
     * 向redis存对象，指定存储时间
     *
     * @param key
     */
    public void set(String key,Object value,long second) {
        redisTemplate.opsForValue().set(key,JSON.toJSONString(value),second);
    }

    /**
     * 获取key对应的值
     *
     * @param key
     */
    public String get(String key) {
        return redisTemplate.opsForValue().get(key);
    }



}
